package com.tedu.api.list;

import org.junit.Test;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**Collection集合下   自己和【叫队列】  包位置：java.util
        * Queue    队列     单端队列
        * Deque    队列     双端队列  ”Deque接口--继承--Queue接口“
        * 作用：保存数据，有序存储和处理，功能：数据缓冲或者多线程协调工作
        *
        * 队列实现类
        * LinkedList：双向链表
        */
public class QueueAPI {
    //Queue   队列      单端队列
    @Test
    public void testQueue(){
        //创建队列--多态--LinkedList
        Queue<String> queue=new LinkedList<>();
        /**
         * offer()   ----add()一样
         * 作用：入队操作，队尾追加元素
         */
        queue.offer("青花瓷");
        queue.offer("冬眠");
        queue.offer("我的滑板鞋");
        queue.offer("体面");
        System.out.println("Queue队列："+queue);
        /**
         * poll()
         * 作用：出队操作，获取队首元素，并且删除队列中队首
         * peek()
         * 作用：出队操作，获取队首元素，不删除队列中队首
         */
        queue.poll();//删除队首元素
        System.out.println("Queue队列："+queue);
        String str=queue.peek();
        System.out.println("队首元素："+str);
        System.out.println("Queue队列："+queue);
        /**
         * 需求：1.遍历队列---while---只遍历一次【队列元素消失】
         *     提示：while  条件：拿到队列总长度  size（）>0  ？
         * 需求：2.遍历队列--增强for---队列元素不消失
         * 提示：for条件：E  e  ：队列
         */
       /** while (queue.size()>0){//true：队列总数>0  队列有元素  遍历
       *     str= queue.poll();//获取队首，删除队列中的队首
        *    System.out.println("获取队列元素");
        *}
        *System.out.println("Queue队列元素："+queue);
        */
        /**
         * 需求：2.遍历队列--增强for---队列元素不消失
         * 提示：for条件：E  e  ：数组泛型/集合泛型：数组引用/集合引用
         */
        for (String e:queue){
            System.out.println("队列元素："+e);
        }
        System.out.println("Queue队列："+queue);

    }
    //Deque    队列     双端队列  ”Deque接口--继承--Queue接口“
    @Test
    public void testDeque(){
        //创建Deque  双端队列  方法基本一致，部分方法不一致
        Deque<String> deque=new LinkedList<>();
        deque.offer("任贤齐");deque.offer("王菲");
        deque.offer("毛阿敏");deque.offer("那英");
        System.out.println("双端队列："+deque);
        //offerFirst() 队首添加元素  OfferLast（）队尾添加元素
        deque.addFirst("蔡徐坤"); deque.addLast("薛之谦");
        System.out.println("双端队列【首尾添加元素】："+deque);
        //getFirst()获取队列中队首     deque.getLast()获取队列中队尾
        System.out.println("获取队列中队首："+deque.getFirst());
        System.out.println("获取队列中队尾："+deque.getLast());
        //
        //
        String xue=deque.peekLast();
        System.out.println("");
        System.out.println();
    }
    /**
     *
     */
    @Test
    public void testStack(){
        //
        Deque<String> stack=new LinkedList<>();
        /**   push()   Deque  独有的方法---支持栈结构
         *    -----offer----add：Collection接口   【添加】
         *      作用：【添加：往栈压入一个元素】  压栈操作
         */
        stack.push("夯大力");
        stack.push("恶搞之家");
        stack.push("喜羊羊");
        stack.push("魔方大厦");
        System.out.println("栈结构"+stack);
        /**
         *pop()   出栈一个尾元素  --pollLast类似【拿先入后出，最后一个压栈元素】
         */
        String lsat=stack.pop();
        System.out.println("出栈尾元素："+lsat);
        System.out.println("栈结构："+stack);
        //面试题：pop、poll、peek的使用区别？
        //pop： 出栈一个尾元素，用于删除最后一个元素【先入后出】
        //poll：出队操作 ，获取队首 元素，并且删除队列中队首
        //peek：出队操作，获队首元素， 不删除队列中队首，
        /**
         *
         *  需求1：遍历一个栈结构---while----元素出栈，队列元素清空
         *  需求2：遍历栈结构---增强for---元素遍历成功，队列元素不变
         */
        while(stack.size()>0){
             stack.poll();
             System.out.println(stack);
        }
        System.out.println(stack);
        for (String  str:stack){
            System.out.println(str);
        }

                System.out.println(stack);
    }
}
